import { ArgumentsHost, HttpException, HttpStatus } from "@nestjs/common";
import { ExceptionFilter } from "./exception-filter.interface";
import { Response } from 'express'

/**
 * HTTP 内置的全局异常过滤器\
 * 该异常过滤器处理的错误类型是 HttpException 及其子类的异常\
 * 当异常不是 HttpException 也不是 HttpException 子类时 内置的异常过滤器会生成
 * 默认的 JSON 响应 { "statusCode": 500, "message": "Internal server error" }
 * 
 */
export class GlobalHttpExceptionFilter implements ExceptionFilter {
  catch(exception: any, host: ArgumentsHost) {
    const ctx = host.switchToHttp()
    const response = ctx.getResponse<Response>()
    if (response.headersSent) return; // 如果已经响应了 则直接返回
    if (exception instanceof HttpException) {
      const exceptionResponse = exception.getResponse() // 调用异常对象的 getResponse 方法获取异常对象响应体
      const status = exception.getStatus() // 调用异常对象的 getStatus 方法获取异常对象的响应HTTP状态码
      if (typeof exceptionResponse === 'string') { // 异常响应体是一个字符串情况
        response
          .status(status) // 复用异常对象中的HTTP状态码
          .json({ // 响应一个JSON给前端
            statusCode: status, // 复用异常对象中的状态码
            message: exceptionResponse,  // 复用异常对象中的响应体
          })
      } else { // 异常响应体是一个对象情况
        response
          .status(status) // 复用异常对象中的HTTP状态码
          .json(exceptionResponse) // 复用异常对象中的对象响应体
      }
    } else {
      response
        .status(500) // 响应HTTP状态码 500
        .json({ // 响应一个JSON对象给前端
          statusCode: HttpStatus.INTERNAL_SERVER_ERROR,
          message: 'Internal server error'
        })
    }
  }
}
